Wang Haihua
🚅 🚋😜 🚑 🚔
王老师周末手洗衣服,在打完肥皂揉搓完毕后,需要将衣服进行漂洗。在有一桶水用于漂洗的情况下,他打算用水将衣服分四次漂洗完,那么这几次漂洗各用多少水能让衣服漂洗得最干净?
由递推数列得到 $$d_4 = W^4 \times \frac{d_0}{\prod_{i=1}^{4}(x_i+W)}$$ 我们的目标是使$d_4$最小
# 总用水量 单位g
M = 25000
# 每次洗衣残留水量 单位g
W = 1000
# 初始污渍量
D = 15
from scipy.optimize import minimize
import numpy as np
e = 1e-10 # 非常接近0的值
fun = lambda x : (W**4*D) / ((x[0]+W)*(x[1]+W)*(x[2]+W)*(x[3]+W)) # 约束函数
cons = ({'type': 'eq', 'fun': lambda x: x[0] + x[1] + x[2] + x[3] -M}, # x1+x2+x3+x4=M
{'type': 'ineq', 'fun': lambda x: x[0] - e}, # x>=e,即 x > 0
{'type': 'ineq', 'fun': lambda x: x[1] - e},
{'type': 'ineq', 'fun': lambda x: x[2] - e},
{'type': 'ineq', 'fun': lambda x: x[3] - e}
)
x0 = np.array((1.0, 100.0, 1.0,1)) # 设置初始值
res = minimize(fun, x0, method='SLSQP', constraints=cons)
print('最小值:',res.fun)
print('最优解:',res.x)
print('迭代终止是否成功:', res.success)
print('迭代终止原因:', res.message)
最小值: 0.005429620333625323 最优解: [6225.25030562 6324.24908313 6225.25030562 6225.25030562] 迭代终止是否成功: True 迭代终止原因: Optimization terminated successfully
import numpy as np
import matplotlib.pyplot as plt
# 总用水量 单位g
M = 25000
# 每次洗衣残留水量 单位g
W = 1000
# 初始污渍量
D = 15
# 最优解数组
dirty = []
# 洗衣次数
times = list(range(1,100))
# 最优目标函数值
def dn(w,d,m,n):
s1 = 256*w**n*d
s2 = m+4*w
s3 = s2**n
return s1/s3
# 绘图
plt.figure()
# 用于正常显示中文
plt.rcParams['font.sans-serif'] = 'SimHei'
#用于正常显示符号
plt.rcParams['axes.unicode_minus'] = False
for n in times:
dirty.append(dn(W,D,M,n))
# 设置标题、轴名
plt.title('污渍量随洗衣次数的变化')
plt.xlabel('洗衣次数')
plt.ylabel('最低污渍量')
plt.plot(times,dirty)
plt.show()
### 拓展二:不同用水量与残存水量比
import numpy as np
import matplotlib.pyplot as plt
# 每次洗衣残留水量 单位g
W = 1000
# 残留水量:总水量
r = np.linspace(0.1,100,100)
# 总用水量 单位g
M = [W*x for x in r]
# 初始污渍量
D = 15
# 最优解数组
dirty = []
# 洗衣次数
N = 4
# 最优目标函数值
def dn(w,d,m,n):
s1 = 256*w**n*d
s2 = m+4*w
s3 = s2**n
return s1/s3
##### 限制y轴取值范围
# 绘图
plt.figure()
# 用于正常显示中文
plt.rcParams['font.sans-serif'] = 'SimHei'
#用于正常显示符号
plt.rcParams['axes.unicode_minus'] = False
for m in M:
dirty.append(dn(W,D,m,N))
# 设置标题、轴名
plt.title('污渍量随污渍用水比的变化')
plt.xlabel('污渍用水比')
plt.ylabel('最低污渍量')
# 限制y轴范围
plt.ylim(0,2)
plt.plot(r,dirty)
plt.savefig('污渍量随污渍用水比的变化.jpg')
plt.show()